package com.czmini.cztest.controller;

import com.alibaba.fastjson.JSONObject;
import com.czmini.cztest.common.TokenDb;
import com.czmini.cztest.config.UserBaseStr;
import com.czmini.cztest.constants.UserConstants;
import com.czmini.cztest.dto.PageTableRequest;
import com.czmini.cztest.dto.PageTableResponse;
import com.czmini.cztest.dto.ResultDto;
import com.czmini.cztest.dto.TokenDto;
import com.czmini.cztest.dto.jenkins.RequestInfoDto;
import com.czmini.cztest.dto.task.*;
import com.czmini.cztest.entity.ZcTestTask;
import com.czmini.cztest.service.ZcTestCaseService;
import com.czmini.cztest.service.ZcTestTaskService;
import com.czmini.cztest.util.CopyUtil;
import com.czmini.cztest.util.StrUtil;
import com.sun.org.apache.regexp.internal.RE;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.testng.annotations.Test;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.Objects;

/**
 * @ProjectName: cztest
 * @Package: com.czmini.cztest.controller
 * @ClassName: ZcTestTaskController
 * @Author: 还是那个橙子
 * @Description: 测试任务管理
 * @Date: 2022/4/30 23:19
 * @Version: 1.0
 */

@Slf4j
@Api(tags = "zctest-测试任务管理")
@RestController
@RequestMapping("/task")
public class ZcTestTaskController {
    @Autowired
    private ZcTestTaskService zcTestTaskService;

    @Autowired
    private TokenDb tokenDb;

    @ApiOperation(value = "添加测试任务")
    @PostMapping
    public ResultDto<ZcTestTask> save(HttpServletRequest request, @RequestBody TestTaskDto testTaskDto) {
        log.info("添加测试任务-入参= " + JSONObject.toJSONString(testTaskDto));
        if (Objects.isNull(testTaskDto)) {
            return ResultDto.fail("测试任务入参不能为空");
        }
        AddZcTestTaskDto addZcTestTaskDto = testTaskDto.getTeskTask();  //添加任务对象

        if (Objects.isNull(addZcTestTaskDto)) {
            return ResultDto.fail("测试任务不能为空");
        }

        if (Objects.isNull(addZcTestTaskDto.getName())) {
            return ResultDto.fail("测试任务名称不能为空");
        }
        List<Integer> caseIdlist = testTaskDto.getCaseIdlist();//  测试用例id集合
        if (Objects.isNull(caseIdlist) || caseIdlist.size() == 0) {
            return ResultDto.fail("测试用例不能为空");
        }

        // 校验token
        TokenDto tokenDto = tokenDb.getTokenDto(request.getHeader(UserBaseStr.LOGIN_TOKEN));
        //通过token获取用户id 赋值
        Integer userId = tokenDto.getUserId();
        addZcTestTaskDto.setCreateUserId(userId);
        Integer defaultJenkinsId = tokenDto.getDefaultJenkinsId();
        addZcTestTaskDto.setTestJenkinsId(defaultJenkinsId);

        ResultDto<ZcTestTask> zcTestTask = zcTestTaskService.save(testTaskDto, UserConstants.TASK_TYPE_ONE);

        return zcTestTask;
    }

    @ApiOperation(value = "修改测试任务")
    @PutMapping
    public ResultDto<ZcTestTask> update(HttpServletRequest request, @RequestBody UpdateZcTestTaskDto updateZcTestTaskDto) {
        log.info("修改测试任务-入参= " + JSONObject.toJSONString(updateZcTestTaskDto));
        if (Objects.isNull(updateZcTestTaskDto)) {
            return ResultDto.fail("测试任务入参不能为空");
        }
        //id
        Integer id = updateZcTestTaskDto.getId();
        if (Objects.isNull(id)) {
            return ResultDto.fail("测试任务id不能为空");
        }
        String name = updateZcTestTaskDto.getName();
        if (Objects.isNull(name)) {
            return ResultDto.fail("测试任务名称不能为空");
        }
        ZcTestTask testTask = new ZcTestTask();
        //赋值
        CopyUtil.copyPropertiesCglib(updateZcTestTaskDto, testTask);
        // 校验token
        TokenDto tokenDto = tokenDb.getTokenDto(request.getHeader(UserBaseStr.LOGIN_TOKEN));
        //通过token获取用户id
        Integer userId = tokenDto.getUserId();
        testTask.setCreateUserId(userId);

        zcTestTaskService.update(testTask);

        return ResultDto.success("成功");
    }

    @ApiOperation(value = "通过id查询任务")
    @GetMapping("/{taskId}")
    public ResultDto<ZcTestTask> getById(HttpServletRequest request, @PathVariable Integer taskId) {
        log.info("获取测试任务-入参= " + JSONObject.toJSONString(taskId));
        if (Objects.isNull(taskId)) {
            return ResultDto.fail("测试任务id不能为空");

        }
        TokenDto tokenDto = tokenDb.getTokenDto(request.getHeader(UserBaseStr.LOGIN_TOKEN));
        ResultDto<ZcTestTask> resultDto = zcTestTaskService.getById(taskId, tokenDto.getUserId());
        log.info("获取测试任务-出参= " + JSONObject.toJSONString(resultDto));
        return resultDto;

    }

    @ApiOperation(value = "通过id删除任务")
    @DeleteMapping("/{taskId}")
    public ResultDto<ZcTestTask> delete(HttpServletRequest request, @PathVariable Integer taskId) {
        log.info("获取测试任务-入参= " + taskId);

        if (Objects.isNull(taskId)) {
            return ResultDto.fail("测试任务id不能为空");
        }
        TokenDto tokenDto = tokenDb.getTokenDto(request.getHeader(UserBaseStr.LOGIN_TOKEN));

        ResultDto<ZcTestTask> resultDto = zcTestTaskService.delete(taskId, tokenDto.getUserId());
        log.info("获取测试任务-出参= " + JSONObject.toJSONString(resultDto));
        return resultDto;
    }

    @ApiOperation(value = "列表查询")
    @GetMapping("/list")
    public ResultDto<PageTableResponse<ZcTestTask>> list(HttpServletRequest request,
                                                         PageTableRequest<QueryZcTestTaskListDto> pageTableRequest) {
        log.info("列表查询-入参= " + JSONObject.toJSONString(pageTableRequest));
        if (Objects.isNull(pageTableRequest)) {
            return ResultDto.fail("列表查询入参不能为空");
        }
        TokenDto tokenDto = tokenDb.getTokenDto(request.getHeader(UserBaseStr.LOGIN_TOKEN));
        QueryZcTestTaskListDto params = pageTableRequest.getParams();

        if (Objects.isNull(params)) {
            params = new QueryZcTestTaskListDto();
        }
        params.setCreateUserId(tokenDto.getUserId());
        pageTableRequest.setParams(params);
        ResultDto<PageTableResponse<ZcTestTask>> responseResultDto = zcTestTaskService.list(pageTableRequest);
        return  responseResultDto;
    }

    /**
     *
     * @param request http请求
     * @param updateZcTestTaskStatusDto 更新任务状态入参
     * @return
     */
    @ApiOperation(value = "修改任务状态")
    @PutMapping("status")
    public ResultDto<ZcTestTask> updateStatus(HttpServletRequest request,
                                              @RequestBody UpdateZcTestTaskStatusDto updateZcTestTaskStatusDto) {
        log.info("修改任务状态-入参= " + JSONObject.toJSONString(updateZcTestTaskStatusDto));
        if (Objects.isNull(updateZcTestTaskStatusDto)) {
            return ResultDto.fail("修改任务状态入参不能为空");
        }
        //校验输入的参数
        Integer TaskId = updateZcTestTaskStatusDto.getTaskId();
        Integer status = updateZcTestTaskStatusDto.getStatus();
        String buildUrl = updateZcTestTaskStatusDto.getBuildUrl();
        if (Objects.isNull(TaskId)) {
            return ResultDto.fail("任务id不能为空");
        }
        if (Objects.isNull(status)) {
            return ResultDto.fail("任务状态不能为空");
        }
        if (Objects.isNull(buildUrl)) {
            return ResultDto.fail("任务构建地址不能为空");
        }
        // 赋值给测试任务实体
        ZcTestTask zcTestTask = new ZcTestTask();
        zcTestTask.setId(TaskId);
        zcTestTask.setStatus(status);
        zcTestTask.setBuildUrl(buildUrl);
        // 获取token
        TokenDto tokenDto = tokenDb.getTokenDto(request.getHeader(UserBaseStr.LOGIN_TOKEN));
        // 获取用户id
        Integer userId = tokenDto.getUserId();

        // 调用service层方法 更新任务状态
        ResultDto<ZcTestTask> resultDto = zcTestTaskService.updateTaskStatus(zcTestTask);
        return resultDto;
    }

    /**
     * 开始任务
     * @param request
     * @param startTaskDto 开始任务
     * @return
     */
    @ApiOperation(value = "开始测试", notes = "开始测试",httpMethod = "POST",response = ResultDto.class)
    @PostMapping("start")
    public ResultDto start(HttpServletRequest request,
                                       @ApiParam(name = "修改测试任务状态对象", required = true)@RequestBody StartTaskDto startTaskDto) throws IOException {
        log.info("开始测试-入参= " + JSONObject.toJSONString(startTaskDto));
        // 前端入参验证
        if (Objects.isNull(startTaskDto)) {
            return ResultDto.fail("开始测试请求入参不能为空");
        }
        if (Objects.isNull(startTaskDto.getTaskId())) {
            return ResultDto.fail("任务id不能为空");
        }
        // 获取token
        String token = request.getHeader(UserBaseStr.LOGIN_TOKEN);
        log.info("获取的 token 信息为====" + token);

        // 赋值 组装testtask参数  zc_test_task表
        ZcTestTask zcTestTask = new ZcTestTask();
        zcTestTask.setId(startTaskDto.getTaskId());
        zcTestTask.setTestCommand(startTaskDto.getTestCommand());
        TokenDto tokenDto = tokenDb.getTokenDto(request.getHeader(UserBaseStr.LOGIN_TOKEN));
        // 设置createUserId
        zcTestTask.setCreateUserId(tokenDto.getUserId());
        zcTestTask.setTestJenkinsId(tokenDto.getDefaultJenkinsId());

        String url = request.getRequestURL().toString();
        log.info("请求地址== "+url);
        url=StrUtil.getHostAndPort(request.getRequestURL().toString());
        //todo Jenkins操作实体 组装requestinfoDTo   参数
        RequestInfoDto requestInfoDto = new RequestInfoDto();
        requestInfoDto.setBaseUrl(url);
        requestInfoDto.setToken(token);
        requestInfoDto.setRequestUrl(url);
        log.info("requestInfoDto== "+ JSONObject.toJSONString(requestInfoDto));

        // 调用service层方法 开始任务
        ResultDto<ZcTestTask> resultDto = zcTestTaskService.startTask(tokenDto,zcTestTask,requestInfoDto);
        return resultDto;
    }
}